package validators;

import java.util.Date;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

public class ValidateDataNascita implements Validator {
       
        //============================================
        // ATTRIBUTI
        //============================================
       
        private Date today = new Date();

        //============================================
        // METODO DI VALIDAZIONE
        //============================================
       
        @Override
        public void validate(FacesContext context, UIComponent component, Object value)
                        throws ValidatorException {
               
                Date dataNascita = (Date) value;
               
                if(dataNascita == null){
                        throw new ValidatorException(generaMessaggio("may not be empty",context));
                }
               
                if(dataNascita.after(today)){
                        throw new ValidatorException(generaMessaggio("Non sei nato nel futuro!",context));
                }
               
                if( ! utenteMaggiorenne(dataNascita)){
                        throw new ValidatorException(generaMessaggio("Devi essere maggiorenne per registrarti, pischello!",context));
                }
               
                if( troppoVecchio(dataNascita) ){
                        throw new ValidatorException(generaMessaggio("Iscrizione non consentita, sei dell'eta' della pietra!",context));
                }
               
        }
       
        //============================================
        // METODI PRIVATI
        //============================================

        @SuppressWarnings("deprecation")
        private boolean utenteMaggiorenne(Date dataNascita){
                if(today.getYear() - dataNascita.getYear() > 18)
                        return true;
                if(today.getYear() - dataNascita.getYear() < 18)
                        return false;
               
                // Ha 18 anni....controllo il mese
                if(today.getMonth() - dataNascita.getMonth() >= 0)
                        return true;
                return false;
        }
       
        @SuppressWarnings("deprecation")
        private boolean troppoVecchio(Date dataNascita){
                if(today.getYear() - dataNascita.getYear() > 100)
                        return true;
                return false;
        }
       
        private FacesMessage generaMessaggio(String testoMessaggio,FacesContext context){
                FacesMessage message = new FacesMessage();
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
                message.setSummary(testoMessaggio);
                context.addMessage("userForm:dataNascita", message);
                return message;
        }
}
